<?php

namespace app\common\serve;


use think\Exception;

/**
 * 基类
 * Class Serve
 * @package app\common\serve
 */
abstract class Serve
{
    /**
     * 计算返佣
     * @param $invest_capital
     * @param int $rate
     * @return float|int
     */
    public static function calcRebateMoney($invest_capital, $rate = 0)
    {
        $rebate_rate = $rate > 0 ? $rate : floatval(config('rebate_rate'));
        return ($invest_capital * ($rebate_rate / 100));
    }

    /**
     * 利息计算
     * @param float $money
     * @param float $day_rate 不除 100
     * @param $day
     * @return float|int
     * 10000 * 2.43% / 360 * 1 = 0.675 ≈ 0.68元
     * 本金 * 0.0234 / 360 * 天数 = 利息
     */
    public static function calcDayInterest($money, $day_rate, $day)
    {
        if ($money < 1 || $day < 1 || $day_rate < 0.0001) return 0;
        return self::bankCalc(($money * ($day_rate / 100) * $day), 2);
    }

    /**
     * 银行家算法
     * @param $num
     * @param $precision
     * @return float|int
     */
    public static function bankCalc($num, $precision)
    {
        $pow = pow(10, $precision);
        if ((floor($num * $pow * 10) % 5 == 0) && (floor($num * $pow * 10) == $num * $pow * 10) && (floor($num * $pow) % 2 == 0)) {//舍去位为5 && 舍去位后无数字 && 舍去位前一位是偶数    =》 不进一
            return floor($num * $pow) / $pow;
        } else {//四舍五入
            return round($num, $precision);
        }
    }

    /**
     * aes 加密
     * @param string $origin_str 原文
     * @param string $key 密钥
     * @return string|bool
     */
    public static function AesEncrypt($origin_str, $key)
    {
        try {
            return openssl_encrypt($origin_str, 'AES-256-CBC', $key, 1);
        } catch (Exception $e) {
            trace('AES加密失败:' . $e->getMessage() . '--' . $e->getLine(), 'error');
            return false;
        }

    }

    /**
     * aes 解密
     * @param string $encrypt_str 密文
     * @param string $key 密钥
     * @return string|bool
     */
    public static function AesDecrypt($encrypt_str, $key)
    {
        try {
            return openssl_decrypt($encrypt_str, 'AES-256-CBC', $key, 1);
        } catch (Exception $e) {
            trace('AES解密失败:' . $e->getMessage() . '--' . $e->getLine(), 'error');
            return false;
        }
    }

    /**
     * 创建订单号
     * @param string $flag 订单号标识：
     * man开头为系统人工充值流水号
     * xxx开头为投标预处理流水号
     *
     * @param int $rand 随机数
     * @param int $length 长度
     * @return string
     */
    public static function createOrderSN($flag = 'man', $rand = 0, $length = 32)
    {
        $rand = $rand > 0 ? $rand : mt_rand(10000, 99999);
        $str = $flag . date('YmdHis') . $rand;

        if (strlen($str) > $length) {
            $str = substr($str, 0, $length);
        }

        return $str;
    }

}